#ifndef QQMUSIC_H
#define QQMUSIC_H

#include <QWidget>
#include<QJsonObject>
#include"volumetool.h"
#include"musiclist.h"
#include<QMediaPlayer>
#include<QMediaPlaylist>
#include"commonpage.h"
#include"lrcpage.h"
#include<QPropertyAnimation>
#include<QSqlDatabase>

QT_BEGIN_NAMESPACE
namespace Ui { class QQMusic; }
QT_END_NAMESPACE

///////////////////////////////////////////////////////
//整个音乐播放器界面//////////////////////////////////////
//////////////////////////////////////////////////////

class QQMusic : public QWidget
{
    Q_OBJECT

public:
    QQMusic(QWidget *parent = nullptr);
    ~QQMusic();
    //初始化音乐播放器的UI主界面
    void InitUI();
    //初始化数据库的方法
    void InitSqlite();
    //初始化不同页面的歌曲音乐列表(从数据库中读取数据并初始化不同页面的音乐列表)
    void InitMusicList();//这里不加启动就会再数据库多加一组
    //初始化媒体播放
    void initPlayer();
    //处理所有的信号和槽函数的关联
    void connectSignalsAndSlots();
    //准备推荐文本和推荐图片
    QJsonArray randomPicture();
    //播放指定页面(page)中下标为index的歌曲
    void playAllOfCommonPage(CommonPage* page,int index);

private slots:
    //点击处理退出的按钮(隐藏页面,在系统托盘显示)
    void on_exit_clicked();
    //处理点击退出菜单按钮的逻辑
    void quitQQMusic();
    //处理BtForm按钮点击时的逻辑
    void onMyFormClick(int pageId);
    //处理点击音量按钮的处理逻辑
    void on_volume_clicked();
    //处理添加本地音乐按钮的处理逻辑
    void on_addLocal_clicked();
    //更新喜欢的音乐以及配置页面的音乐列表
    void onupdataLikeMusic(bool isLike,const QString& musicId);

    //播放控制区的槽函数
    //处理点击播放和暂停按钮的处理逻辑
    void onPlayClicked();
    //处理媒体播放状态发生改变的处理逻辑
    void onStateChanged();
    //处理点击上一曲按钮的处理逻辑
    void onPlayUp();
    //处理点击下一曲按钮的处理逻辑
    void onPlayDown();
    //处理点击播放模式按钮的处理逻辑
    void onPlaybackModeClicked();
    //处理媒体播放模式发生改变的处理逻辑
    void onPlaybackModeChanged(QMediaPlaylist::PlaybackMode playbackMode);

    //处理点击播放所有按钮的处理逻辑
    void onPlayAll(PageType pageType);
    //处理双击歌曲Item的处理逻辑
    void onPlayMusicByIndex(CommonPage* page,int index);
    //处理当前播放的歌曲发生改变的处理逻辑
    void onCurrentIndexChanged(int index);
    //处理点击静音/非静音按钮的处理逻辑
    void onSetMusicSilence(bool isMuted);
    //处理音量调节的处理逻辑
    void onSetMusicVolume(int volume);
    //处理播放源持续总时长发生改变(媒体切换)的处理逻辑
    void onDurationChanged(qint64 duration);
    //处理播放源当前播放时长发生改变的处理逻辑
    void onPositionChanged(qint64 duration);

    //处理拖动进度条导致歌曲播放进度以及当前时间显示标签改变的处理逻辑
    void onMusicSliderChanged(float ratio);
    //处理播放源变化时更新相应的媒体元数据的显示标签(歌曲名称,歌手,封面图片,歌词的同步)
    void onMetaDataAvailableChangedChanged(bool available);
    //处理点击歌词按钮的处理逻辑
    void onLrcWordClicked();
    //处理点击最小化按钮的处理逻辑
    void on_min_clicked();
    //处理点击换肤按钮的处理逻辑
    void on_skin_clicked();
    //更新所有按钮(myFrom)的动画效果-->动画效果标记正在播放歌曲的页面
    void updateMyformAnimal();

protected:
    //重写鼠标按下事件-->处理鼠标拖动窗口
    void mousePressEvent(QMouseEvent *event);
    //重写鼠标移动事件-->处理鼠标拖动窗口
    void mouseMoveEvent(QMouseEvent *event);


private:
    Ui::QQMusic *ui;
    QPoint dragPosition;//记录光标相对于窗⼝标题栏的相对距离
    VolumeTool* volume;//调节音量弹窗对象
    MusicList musicList;//用于管理所有加载进程序的歌曲文件的歌曲列表对象(用于组织歌曲文件)
    QMediaPlayer* player;//表示当前播放音乐所代表的媒体文件
    QMediaPlaylist* playList;//表示管理所有媒体文件的播放列表(用于组织媒体文件),包括一些播放模式的设置等
    CommonPage* currentPage;//用于记录当前正在播放的页面
    qint64 totalDuration;//记录当前媒体源的总时间
    int currentPlayMusicIndex;//记录当前媒体播放源在媒体列表中的索引
    LrcPage* lrcPage;//歌词页面对象
    QPropertyAnimation* lrcAnimation;//表示歌词页面的上移动画(记录歌词页面上移动画)
    QSqlDatabase sqlite;//用于表示保存数据的数据库
    bool isDrag;//用于表示鼠标是否拖拽
};
#endif // QQMUSIC_H
